// Package main 演示GORM高级查询操作，包括Scan数据映射、分组查询和去重查询等功能
// 本示例展示了如何在GORM中将查询结果映射到不同的数据结构，以及如何执行分组统计和去重查询
package main

import (
	"fmt"
	"gin-gorm/global"
	"gin-gorm/models"
)

// HighQuery 演示各种高级查询操作
// 该函数包含了GORM中的Scan、分组查询和去重查询等高级功能的使用示例
func HighQuery() {

	// 扫描到切片
	// 将查询结果的特定列扫描到字符串切片中
	// 这种方式适用于只需要获取表中某一列的所有值的场景
	// var nameList []string
	// 使用Select指定要查询的列，然后使用Scan将结果扫描到切片
	// global.DB.Model(models.UserModel{}).Select("name").Scan(&nameList)
	// Pluck方法是Select和Scan的简便组合，专门用于获取单列数据
	// 对于单列数据查询，Pluck比Select+Scan更简洁高效
	// global.DB.Model(models.UserModel{}).Pluck("name", &nameList)
	// fmt.Println(nameList)

	// 扫描到结构体
	// 将查询结果扫描到完整的模型结构体切片中
	// 这种方式会映射表中的所有字段到结构体的对应字段
	// var userList []models.UserModel
	// 使用Scan方法将查询结果映射到UserModel类型的切片
	// global.DB.Model(models.UserModel{}).Scan(&userList)
	// fmt.Println(userList)

	// 扫描特定字段到自定义结构体
	// 只查询指定的字段并映射到自定义结构体，适用于只需要部分字段的场景
	// 这种方式可以提高查询效率，减少数据传输量
	// type User struct {
	// 	Name string `gorm:"column:name"` // 使用标签映射到数据库的 name 列
	// 	Age  int    `gorm:"column:age"`  // 使用标签映射到数据库的 age 列
	// }
	// var usersList []User
	// 将查询结果映射到自定义的User结构体切片
	// global.DB.Model(models.UserModel{}).Scan(&usersList)
	// fmt.Println(usersList)

	// 分组查询
	// 使用GROUP BY子句进行分组统计，适用于需要按某个字段分类统计数据的场景
	// 这种方式常用于生成统计报表或数据分析
	// type UserCount struct {
	// 	Age   int  // 对应GROUP BY子句中的分组字段
	// 	Count int  // 对应聚合函数COUNT(*)的结果
	// }
	// var lis []UserCount
	// 按年龄分组，统计每个年龄段的用户数量
	// 使用Group方法指定分组字段，Select方法指定要查询的字段和聚合函数
	// global.DB.Model(models.UserModel{}).Group("age").Select("age, count(*) as count").Scan(&lis)
	// fmt.Println(lis)

	// 去重查询
	// 使用Distinct方法去除查询结果中的重复值，适用于只需要唯一值的场景
	// 这种方式可以避免返回重复数据，减少数据处理量
	var ageList []int
	// 查询不重复的年龄值
	// 组合使用Distinct和Pluck方法，获取表中唯一的age值列表
	global.DB.Model(models.UserModel{}).Distinct("age").Pluck("age", &ageList)
	fmt.Println(ageList)

}

// main 程序入口函数
func main() {
	// 初始化数据库连接
	global.Connect()
	HighQuery()

}
